
#include "app_manager.h"
#include "../app_logo_anim.h"
#include "lvgl.h"

#if APP_LOGO_ANIM_EN

#define APP_NAME "动画logo"
#define AUTHOR "启凡科创"
#define VERSION "1.0.1"

LV_IMG_DECLARE(app_logo_anim_img_log1);
LV_IMG_DECLARE(app_logo_anim_img_log2);
LV_IMG_DECLARE(app_logo_anim_img_log3);
LV_IMG_DECLARE(app_logo_anim_img_log4);
LV_IMG_DECLARE(app_logo_anim_img_log5);

#define h (LV_VER_RES / 2 + LOGO_POS_OFFSET_Y + 93)
#define delay_t (700)

static lv_obj_t *scr = NULL;
static int16_t n_y = 0;
static uint8_t sta = 0;

static void set_ball_y(lv_obj_t *obj, int32_t v);
static void ui_anim_cb(lv_anim_t *e);

static void scr_del_cb(lv_event_t *e)
{
    scr = NULL;
}

static void ui_hid_cb(lv_anim_t *e)
{
    if (e->user_data == (void *)0x98)
        app_manager_open(0, LOAD_APP_NAME_AFTER_ANIM, (void *)LV_SCR_LOAD_ANIM_FADE_IN, 500, LOGO_KEEP_SHOW_TIME);
    else
        lv_obj_add_flag((lv_obj_t *)e->var, LV_OBJ_FLAG_HIDDEN);
}

static void set_ball_y(lv_obj_t *obj, int32_t v)
{
    static float cnt = 0;
    static uint8_t last_sta = 0;

    if (v == h - 300)
    {
        cnt = 0;
        n_y = h - 300;
        sta = 0;
    }
    if (sta == 0)
    {
        cnt += 0.3;
        n_y += cnt;
    }
    else if (sta == 1)
    {
        cnt -= 0.4;
        n_y -= cnt;
        last_sta = 1;
    }
    else if (sta == 2)
    {
        if (last_sta == 1)
        {
            last_sta = 2;
            cnt = 6;
        }
        cnt += 0.15;
        n_y += cnt;
    }
    lv_obj_set_y(obj, n_y);
}

static void ball_bounced_cb(lv_anim_t *e)
{
    lv_obj_t *scr = lv_scr_act();
    lv_obj_t *ball = lv_obj_get_child(scr, 5);

    lv_anim_t a;
    lv_anim_init(&a);

    lv_anim_set_var(&a, ball);

    lv_anim_set_user_data(&a, e->user_data);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)set_ball_y);

    sta++;

    if (sta == 1)
    {
        lv_anim_set_time(&a, delay_t);
        lv_anim_set_values(&a, n_y, h - 250);
        lv_anim_set_deleted_cb(&a, ball_bounced_cb);
    }
    else
    {
        lv_anim_set_time(&a, delay_t / 2.5);
        lv_anim_set_values(&a, h - 250, h - 80);
        lv_anim_set_deleted_cb(&a, ui_anim_cb);
    }

    lv_anim_start(&a);
}

static void ui_anim_cb(lv_anim_t *e) // logo
{
    lv_obj_t *scr = lv_scr_act();

    lv_obj_t *img = lv_obj_get_child(scr, 0);
    lv_obj_t *img2 = lv_obj_get_child(scr, 1);
    lv_obj_t *img3 = lv_obj_get_child(scr, 2);
    lv_obj_t *img4 = lv_obj_get_child(scr, 3);
    lv_obj_t *img5 = lv_obj_get_child(scr, 4);

    lv_obj_t *hid_up = lv_obj_get_child(img, 0);
    lv_obj_t *hid_mid = lv_obj_get_child(img, 1);
    lv_obj_t *hid_down = lv_obj_get_child(img, 2);

    lv_anim_t a;

    int y = (int)e->user_data % 1000;

    lv_obj_add_flag((lv_obj_t *)e->var, LV_OBJ_FLAG_HIDDEN);
    lv_obj_clear_flag(img, LV_OBJ_FLAG_HIDDEN);
    lv_obj_clear_flag(img2, LV_OBJ_FLAG_HIDDEN);
    lv_obj_clear_flag(img3, LV_OBJ_FLAG_HIDDEN);
    lv_obj_clear_flag(img4, LV_OBJ_FLAG_HIDDEN);
    lv_obj_clear_flag(img5, LV_OBJ_FLAG_HIDDEN);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
    lv_anim_init(&a);
    lv_anim_set_var(&a, hid_up);

    lv_anim_set_values(&a, 117, 38);
    lv_anim_set_time(&a, 160);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_height);
    lv_anim_set_delay(&a, 0);
    lv_anim_start(&a);

    lv_anim_set_values(&a, 166, 70);
    lv_anim_set_time(&a, 200);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_width);
    lv_anim_set_delay(&a, 80);
    lv_anim_set_deleted_cb(&a, ui_hid_cb);
    lv_anim_start(&a);

    ////////////////

    lv_anim_set_var(&a, hid_mid);
    lv_anim_set_deleted_cb(&a, NULL);

    lv_anim_set_values(&a, 70, 40);
    lv_anim_set_time(&a, 60);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_width);
    lv_anim_set_delay(&a, 280);
    lv_anim_start(&a);

    lv_anim_set_values(&a, 139, 0);
    lv_anim_set_time(&a, 180);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_height);
    lv_anim_set_delay(&a, 310);
    lv_anim_set_deleted_cb(&a, ui_hid_cb);
    lv_anim_start(&a);

    ///////////

    lv_anim_set_var(&a, hid_down);

    lv_anim_set_values(&a, 104, 0);
    lv_anim_set_time(&a, 200);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_width);
    lv_anim_set_delay(&a, 310 + 180);
    lv_anim_start(&a);

    ///////////////////////////////////////////////////////////////////////////////////////////

    lv_anim_set_var(&a, img2);
    lv_anim_set_deleted_cb(&a, NULL);

    lv_anim_set_values(&a, 0, 68);
    lv_anim_set_time(&a, 300);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_height);
    lv_anim_set_delay(&a, 0);
    lv_anim_start(&a);

    lv_anim_set_values(&a, 50, 102);
    lv_anim_set_time(&a, 250);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_width);
    lv_anim_set_delay(&a, 250);
    lv_anim_start(&a);

    ////////////////////////////////////////////////////////////////////

    lv_anim_set_var(&a, img3);

    lv_anim_set_values(&a, 0, 76);
    lv_anim_set_time(&a, 350);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_width);
    lv_anim_set_delay(&a, 0);
    lv_anim_start(&a);

    lv_anim_set_values(&a, 50, 157);
    lv_anim_set_time(&a, 500);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_height);
    lv_anim_set_delay(&a, 250);
    lv_anim_start(&a);

    lv_anim_set_values(&a, 157 - 50 + y, y);
    lv_anim_set_time(&a, 500);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_y);
    lv_anim_set_delay(&a, 250);
    lv_anim_start(&a);

    lv_anim_set_values(&a, -(157 - 50), 0);
    lv_anim_set_time(&a, 500);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_img_set_offset_y);
    lv_anim_set_delay(&a, 250);
    lv_anim_start(&a);

    ////////////////////////////////////////////////////////////////////////////////////////

    lv_anim_set_var(&a, img4);

    lv_anim_set_values(&a, 0, 93);
    lv_anim_set_time(&a, 250);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_height);
    lv_anim_set_delay(&a, 550);
    lv_anim_start(&a);

    lv_anim_set_values(&a, (93 + 70 + y), y + 70);
    lv_anim_set_time(&a, 250);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_y);
    lv_anim_set_delay(&a, 550);
    lv_anim_start(&a);

    lv_anim_set_values(&a, -93, 0);
    lv_anim_set_time(&a, 250);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_img_set_offset_y);
    lv_anim_set_delay(&a, 550);
    lv_anim_start(&a);

    ////////////////////////////////////////////////////////////////////////////////////////

    lv_anim_set_var(&a, img5);

    lv_anim_set_values(&a, 0, 91);
    lv_anim_set_time(&a, 180);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_width);
    lv_anim_set_delay(&a, 800);
    lv_anim_set_deleted_cb(&a, ui_hid_cb);
    lv_anim_set_user_data(&a, (void *)0x98);
    lv_anim_start(&a);
}

static void ui_loaded_cb(lv_event_t *e) // 大圈动画
{
    lv_obj_t *scr = lv_event_get_target(e);
    lv_obj_t *img = lv_obj_get_child(scr, 0);
    lv_obj_t *img2 = lv_obj_get_child(scr, 1);
    lv_obj_t *img3 = lv_obj_get_child(scr, 2);
    lv_obj_t *img4 = lv_obj_get_child(scr, 3);
    lv_obj_t *img5 = lv_obj_get_child(scr, 4);
    lv_obj_t *ball = lv_obj_get_child(scr, 5);

    lv_anim_t a;

    lv_obj_clear_flag(ball, LV_OBJ_FLAG_HIDDEN);
    lv_obj_add_flag(img, LV_OBJ_FLAG_HIDDEN);
    lv_obj_add_flag(img2, LV_OBJ_FLAG_HIDDEN);
    lv_obj_add_flag(img3, LV_OBJ_FLAG_HIDDEN);
    lv_obj_add_flag(img4, LV_OBJ_FLAG_HIDDEN);
    lv_obj_add_flag(img5, LV_OBJ_FLAG_HIDDEN);

    lv_anim_init(&a);

    /////////////////////////////////////////////////////////////////////////////////

    lv_anim_set_var(&a, ball);

    lv_anim_set_values(&a, h - 300, h);
    lv_anim_set_time(&a, delay_t);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)set_ball_y);
    lv_anim_set_delay(&a, 0);
    lv_anim_set_user_data(&a, e->user_data);
    lv_anim_set_deleted_cb(&a, ball_bounced_cb);
    lv_anim_start(&a);

    lv_anim_set_values(&a, LV_HOR_RES / 2 - 150 + LOGO_POS_OFFSET_X, ((int)e->user_data / 1000) + 95);
    lv_anim_set_time(&a, delay_t * 2 + delay_t / 2.5);
    lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_x);
    lv_anim_set_delay(&a, 0);
    lv_anim_set_deleted_cb(&a, NULL);
    lv_anim_start(&a);
}

static void *create_ui(void *arg)
{
    if (scr != NULL)
        return scr;
    scr = lv_obj_create(NULL);
    lv_obj_clear_flag(scr, LV_OBJ_FLAG_SCROLLABLE);

    lv_obj_t *img = lv_img_create(scr);
    lv_obj_clear_flag(img, LV_OBJ_FLAG_SCROLLABLE);
    lv_img_set_src(img, &app_logo_anim_img_log1);
    lv_obj_align(img, LV_ALIGN_CENTER, LOGO_POS_OFFSET_X, LOGO_POS_OFFSET_Y);
    lv_obj_add_flag(img, LV_OBJ_FLAG_HIDDEN);

    lv_obj_t *hid_up = lv_obj_create(img);
    lv_obj_clear_flag(hid_up, LV_OBJ_FLAG_SCROLLABLE);
    lv_obj_set_style_radius(hid_up, 0, 0);
    lv_obj_set_style_bg_color(hid_up, lv_obj_get_style_bg_color(scr, 0), 0);
    lv_obj_set_style_border_width(hid_up, 0, 0);
    lv_obj_set_size(hid_up, 166, 117);

    lv_obj_t *hid_mid = lv_obj_create(img);
    lv_obj_clear_flag(hid_mid, LV_OBJ_FLAG_SCROLLABLE);
    lv_obj_set_style_radius(hid_mid, 0, 0);
    lv_obj_set_style_bg_color(hid_mid, lv_obj_get_style_bg_color(scr, 0), 0);
    lv_obj_set_style_border_width(hid_mid, 0, 0);
    lv_obj_set_size(hid_mid, 70, 139);
    lv_obj_align(hid_mid, LV_ALIGN_BOTTOM_LEFT, 0, -50);

    lv_obj_t *hid_down = lv_obj_create(img);
    lv_obj_clear_flag(hid_down, LV_OBJ_FLAG_SCROLLABLE);
    lv_obj_set_style_radius(hid_down, 0, 0);
    lv_obj_set_style_bg_color(hid_down, lv_obj_get_style_bg_color(scr, 0), 0); //
    lv_obj_set_style_border_width(hid_down, 0, 0);
    lv_obj_set_size(hid_down, 104, 50);
    lv_obj_align(hid_down, LV_ALIGN_BOTTOM_RIGHT, -51, 0);

    /////////////////////////////////////////////////////////////////////////////////

    lv_obj_t *img2 = lv_img_create(scr);
    lv_obj_clear_flag(img2, LV_OBJ_FLAG_SCROLLABLE);
    lv_img_set_src(img2, &app_logo_anim_img_log2);
    lv_obj_align_to(img2, img, LV_ALIGN_TOP_LEFT, 95, 118);
    lv_obj_set_size(img2, 50, 0);

    /////////////////////////////////////////////////////////////////////////////////

    int x = lv_obj_get_x(img);
    int y = lv_obj_get_y(img);

    lv_obj_t *img3 = lv_img_create(scr);
    lv_obj_clear_flag(img3, LV_OBJ_FLAG_SCROLLABLE);
    lv_img_set_src(img3, &app_logo_anim_img_log3);
    lv_obj_set_size(img3, 0, 50);
    lv_obj_set_x(img3, x + 114);
    lv_obj_set_y(img3, 157 - 50 + y);
    lv_img_set_offset_y(img3, -(157 - 50));

    /////////////////////////////////////////////////////////////////////////////////

    lv_obj_t *img4 = lv_img_create(scr); // 103 93
    lv_obj_clear_flag(img4, LV_OBJ_FLAG_SCROLLABLE);
    lv_img_set_src(img4, &app_logo_anim_img_log4);
    lv_obj_set_size(img4, 103, 0);
    lv_obj_set_x(img4, x + 30);
    lv_obj_set_y(img4, y + 70 + 93);
    lv_img_set_offset_y(img4, 93);

    /////////////////////////////////////////////////////////////////////////////////

    lv_obj_t *img5 = lv_img_create(scr);
    lv_obj_clear_flag(img5, LV_OBJ_FLAG_SCROLLABLE);
    lv_img_set_src(img5, &app_logo_anim_img_log5);
    lv_obj_align_to(img5, img, LV_ALIGN_TOP_LEFT, 65, 38);
    lv_obj_set_width(img5, 0);

    /////////////////////////////////////////////////////////////////////////////////

    lv_obj_t *ball = lv_obj_create(scr);
    lv_obj_clear_flag(ball, LV_OBJ_FLAG_SCROLLABLE);
    lv_obj_set_style_border_color(ball, lv_color_hex(0xf6b428), 0);
    lv_obj_set_size(ball, 40, 40);
    lv_obj_set_style_radius(ball, LV_RADIUS_CIRCLE, 0);
    lv_obj_set_style_bg_color(ball, lv_color_hex(0x1f8abe), 0);

    lv_obj_set_x(ball, LV_HOR_RES / 2 - 150 + LOGO_POS_OFFSET_X);
    lv_obj_set_y(ball, h - 300);

    /////////////////////////////////////////////////////////////////////////////////
    lv_obj_add_event_cb(scr, ui_loaded_cb, LV_EVENT_SCREEN_LOADED, (void *)(x * 1000 + y));
    lv_obj_add_event_cb(scr, scr_del_cb, LV_EVENT_DELETE, NULL);

    return scr;
}

void app_logo_anim_register(void)
{
    app_manager_register_t cfg;
    app_manager_config_struct_init(&cfg);

    cfg.name = APP_NAME;
    cfg.create_ui = create_ui;
    cfg.author = AUTHOR;
    cfg.ui_type = APP_UI_HAVE;
    cfg.version = VERSION;
    cfg.visible = APP_INVISIBLE;

    app_manager_register_app(&cfg);
}

#endif
